package exception;

/**
 * JAVA 异常处理机制
 * <p>
 * java.lang.Throwable是所有java中错误的顶级超类
 * 其下面派生了两个子类型：
 * Error和Exception
 * Error(错误)表示不可恢复的错误，一般表示系统级别问题，出现后通常程序就直接结束了。
 * Exception(意外，例外)是可以恢复的错误，如果正常处理完程序可以继续运行。
 * <p>
 * 而java异常处理机制通常关心的就是Exception这类问题，不关心Error。
 */
public class TryCatchDemo {
    public static void main(String[] args) {
        System.out.println("程序开始了");
         /*
            异常处理机制是使用在明知程序执行过程中可能出现某种不可抗因素导致的错误，无法
            通过逻辑避免掉的问题，此时针对这类异常指定B计划。
         */
        try {
            String str = "";
            System.out.println(str.charAt(0));
            //try语句块中如果某句代码出现异常，那么其后的所有代码均不执行
            System.out.println("!!!!!!!");
        } catch (NullPointerException | StringIndexOutOfBoundsException e) {//e就接受（捕获到）异常，执行B计划
            System.out.println("出现了空指针异常或字符串下标越界异常，并解决了");
        }//用异常的超类捕获
        catch (Exception e) {//没有针对性解决问题，超类必须在子类之下，最好进行处理
        /*
            捕获超类异常，凡是该异常的子类型异常都可以使用这个catch处理
            这种捕获粒度比较粗糙，一般不建议用特别靠上的超类。
        */
            System.out.println("通用解决方法");
        }


        /*情况3
        try {
            String str = "";
            System.out.println(str.charAt(0));
        } catch (NullPointerException | StringIndexOutOfBoundsException e) {//e就接受（捕获到）异常，执行B计划
            System.out.println("出现了空指针异常或字符串下标越界异常，并解决了");
        }
         */


        /*情况2
        try {
            String str="";
            System.out.println(str.charAt(0));
        }catch (NullPointerException e){//e就接受（捕获到）异常，执行B计划
            System.out.println("出现了空指针，并解决了");
        }catch (StringIndexOutOfBoundsException e){
            System.out.println("出现了字符串下标越界，并解决了");
        }
         */

        /*情况1
        try {
           String str=null;
           System.out.println(str.length());//A计划出现异常
        }catch (NullPointerException e){//e就接受（捕获到）异常，执行B计划
            System.out.println("出现了空指针，并解决了");
        }
         */

        System.out.println("程序结束了");
    }
}